//
// Created by antler on 2018/12/19.
//

#ifndef LUA_UIVIEW_H
#define LUA_UIVIEW_H

#include <string>
#include <jni.h>

#define CLASSNAME_UIVIEW "UIView"
#define USERTYPE_UIVIEW "UIView"

class UIView {
public:
    friend class UIContext;

public:
    UIView();

    ~UIView();

    // 获取组件标识
    // UI中根节点的ID是无法自定义或无法修改的，有固定值'_root'
    std::string getID();

    // 获取组件类型
    int getType();

    // 获取组件属性
    bool getAttr_Bool(const std::string &key, bool def);

    int getAttr_Int(const std::string &key, int def);

    std::string getAttr_String(const std::string &key, const std::string &def);

    // 获取组件所有属性
    std::string getAttrs();

    // 获取组件样式
    bool getStyle_Bool(const std::string &key, bool def);

    int getStyle_Int(const std::string &key, int def);

    std::string getStyle_String(const std::string &key, const std::string &def);

    // 获取组件所有样式
    std::string getStyles();

    // 获取组件伪样式
    bool getPseudoStyle_Bool(const std::string &key, bool def);

    int getPseudoStyle_Int(const std::string &key, int def);

    std::string getPseudoStyle_String(const std::string &key, const std::string &def);

    //  获取组件所有伪样式
    std::string getPseudoStyles();

    // 设置组件属性
    void setAttr(const std::string &attrs);

    // 设置组件样式
    void setStyle(const std::string &styles);

    // 设置组件伪样式
    void setPseudoStyle(const std::string &pseudo, const std::string &styles);

    // 获取组件的子组件数量
    int subviewsCount();

    // 获取子组件
    UIView *getSubview(int index);

    // 添加子组件
    // 将subview添加到当前UIView子组件列表的第index处（注意index从1开始计数，默认添加到末尾）
    void addSubview(UIView *subview, int index);

    // 移除子组件
    void removeSubview(int index);

    // 将当前组件从父组件移除
    void removeFromParent();

    // 设置组件的回调函数
    void setActionCallback(int action, int funID);

    // 将组件的当前设置导出为Json格式字符串
    std::string toJson();

protected:
    bool initWith(jobject juicontext);

    bool isOk();

    jobject getUIViewObject();

    void setUIViewObject(jobject juiview);

    void releaseUIViewObject();

    void removeAllActionCallback();

protected:
    jobject mUIViewObj;
};


#endif //LUA_UIVIEW_H
